import cv2
import numpy as np
# 这份代码可以读取视频，也可以读取摄像头，
# 读取之后，可以设定窗口让视频流显示出来，还可以拍照保存视频流的照片

# 这份代码没有使用矫正函数，所以如果是一般的摄像头就会有畸变，故意保留下来没有矫正的摄像头代码


# 创建窗口camera_wig,video_wig
cv2.namedWindow('camera_wig', cv2.WINDOW_NORMAL)
# cv2.namedWindow('video_wig', cv2.WINDOW_NORMAL)

# 初始化窗口的大小
cv2.resizeWindow('camera_wig', 640, 480)
# cv2.resizeWindow('video_wig', 640, 960)

# 从摄像设备获取摄像头数据，用cap_camera_wig来接收到这个数据
# 这里就是有一个参数，cv2.CAP_DSHOW，能去掉视频黑边，但是OpenCV3当中不支持这个
cap_camera_wig = cv2.VideoCapture(0, cv2.CAP_DSHOW)       # cv_4.2.1.30_cp38
# cap_camera_wig = cv2.VideoCapture(0)                      # cv_3.4.2.16_cp37
# 从视频当中获取数据，用cap_video_wig来接收这个数据
# cap_video_wig = cv2.VideoCapture(r"D:\Desktop\Opencv_Learning\Video\Video_birthday_70.mp4")


# 计算图片的平均亮度，对标现场环境的光线亮度
def get_value_mean(img):
    # 将图像变为灰度图
    wig_Gray = cv2.cvtColor(img, cv2.COLOR_BGRA2GRAY)

    # 计算图像的平均亮度值
    mean_value = cv2.mean(wig_Gray)[0]

    return mean_value


# 对图片进行白平衡的后期处理
def adjust_image_brightness(img):
    # 先计算图像的平均亮度
    img_mean_value = get_value_mean(img)

    # 如果平均亮度小于100，就进行调整
    if img_mean_value < 100:

        # 获取图片的HSV格式
        img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

        # 计算调整用的值
        brightness_for_add = (100 - img_mean_value) * 1.5

        # 分离出HSV三个域的空间通道
        h, s, v = cv2.split(img_hsv)

        # 生成增加之后的V域，同时使用clip归一化函数，限制值在255范围内
        v1 = np.clip(cv2.add(1 * v, brightness_for_add), 0, 255)

        # 生成增加之后的S域，同时使用clip归一化函数，限制值在255范围内
        s1 = np.clip(cv2.add(1 * s, brightness_for_add), 0, 255)

        # 增加v,s域明度,饱和度用merge将三个通道合一
        img_hsv1 = np.uint8(cv2.merge((h, s1, v1)))

        # 转换回BGR格式
        sum_wig = cv2.cvtColor(img_hsv1, cv2.COLOR_HSV2BGR)

# ---------------------------------
        # 先前的方法
        #

        # 对HSV图片进行亮度增强
        # 生成一个用于进行加法的矩阵
        # pic_for_add = np.full((480, 640, 3), brightness_for_add, np.uint8)
        #
        # # 拿到求和结果
        # sum_wig = cv2.add(img, pic_for_add)

# --------------------------------
        # 看下图像调整之后的亮度
        value_after_adjust = get_value_mean(sum_wig)

        print('处理前亮度：', img_mean_value, '处理后亮度：', value_after_adjust)

        return sum_wig

    else:
        print('无需处理（亮度）：', img_mean_value)
        sum_wig = img

        return sum_wig


# 进入显示视频帧的循环
while True:

    # 使用read这个函数读取视频帧，  返回bool值和   Mat图片数据
    # ret  //是否读取到数据
    # frame  //读取到的Mat数据
    ret1, frame1 = cap_camera_wig.read()
    # ret2, frame2 = cap_video_wig.read()

    # 这里将获取到的摄像头视频帧进行一个翻转操作(这个操作是后面添加上去的，可以随需求进行调整)
    # frame1 = cv2.flip(frame1, flipCode=1)

    # 如果读取到了，打印日志
    if ret1:
        # print("摄像头读取成功")
        # 这里打印的摄像头采集到的图片的长和宽
        # print(frame1.shape[1], frame1.shape[0])
        pass
    # if ret2:
    #     print("视频读取成功22222")

    # meanl_value = get_value_mean(frame1)
    # print('图片平均亮度: ', meanl_value)

    adjust_image = adjust_image_brightness(frame1)
    cv2.imshow('adjust_image', adjust_image)


    # 用imshow来显示读取到的视频帧数据
    cv2.imshow('camera_wig', frame1)

    # cv2.imshow('video_wig', frame2)

    # 等待10ms看有没有按键按下，读取指令
    key_wig = cv2.waitKey(1)

    # 这里设置了退出的指令
    if (key_wig & 0xFF) == ord('q'):
        print("Exit the programme")
        break
    # 这里还设置了保存指令
    elif (key_wig & 0xFF) == ord('s'):
        cv2.imwrite(
            r"D:\Desktop\Opencv_Learning\Camera_set_img\camera_set_10.png",
            frame1,
            None
        )
        print("The image of camera has been saved")

    # elif (key_wig & 0xFF) == ord('d'):
    #     cv2.imwrite(
    #         r"D:\Desktop\Opencv_Learning\the image\300039.png",
    #         frame2,
    #         None
    #     )
    #     print("The image of video has been saved")


# 释放VideoCapture这个函数产生的变量 cap_wig
cap_camera_wig.release()
# cap_video_wig.release()

# 释放窗口
cv2.destroyAllWindows()
